package com.mxj.indexer.command;

import com.mxj.indexer.core.IndexManager;
import com.mxj.indexer.model.Document;
import com.mxj.indexer.properties.IndexerProperties;
import com.mxj.indexer.util.FileScanner;
import com.sun.deploy.net.MessageHeader;
import lombok.extern.slf4j.Slf4j;
import org.ansj.domain.Term;
import org.ansj.splitWord.analysis.ToAnalysis;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Component;

import java.io.File;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collector;
import java.util.stream.Collectors;

/**构建索引的模块，是整个程序的逻辑入口
 * @author yuisama
 * @date 2023/04/08 16:04
 **/
@Lazy
@Slf4j      // 添加 Spring 日志的使用
@Component  // 注册成 Spring 的 bean
//@Profile("run") // 让跑测试的时候不加载这个 bean（run != test)
public class Index implements CommandLineRunner {
    // 需要依赖 IndexerProperties 对象（配置信息）
    private final IndexerProperties properties;
    // 需要依赖 FileScanner 对象
    private final FileScanner fileScanner;
    // 索引管理对象（全局只需要一份）
    private final IndexManager indexManager;

    @Autowired  // 构造方法注入的方式，让 Spring 容器，注入 FileScanner 对象进来 —— DI
    public Index(IndexerProperties properties, FileScanner fileScanner, IndexManager indexManager) {
        this.properties = properties;
        this.fileScanner = fileScanner;
        this.indexManager = indexManager;
    }

    @Override
    public void run(String... args) throws Exception {
        log.info("这里的整个程序的逻辑入口");

        // 1. 扫描出来所有的 html 文件
//        // 可以把目录写死，但更好的办法是把目录路径放到配置文件中，方便以后修改
//        List<File> htmlFileList = fileScanner.scanFile("D:\\课程\\2022-08-02-Java19-22班-项目-2\\docs\\api", file -> {
//            return file.isFile() && file.getName().endsWith(".html");
//        });

        log.debug("开始扫描目录，找出所有的 html 文件。{}", properties.getDocRootPath());
        List<File> htmlFileList = fileScanner.scanFile(properties.getDocRootPath(), file -> {
            return file.isFile() && file.getName().endsWith(".html");
        });
        log.debug("扫描目录结束，一共得到 {} 个文件。", htmlFileList.size());

        // 2. 针对每个 html 文件，得到其 标题、URL、正文信息，把这些信息封装成一个对象（文档 Document）
//        List<Document> documentList = new ArrayList<>();
//        File rootFile = new File(properties.getDocRootPath());
//        for (File htmlFile : htmlFileList) {
//            Document document = new Document(htmlFile, properties.getUrlPrefix(), rootFile);
//        }

        File rootFile = new File(properties.getDocRootPath());
        List<Document> documentList = htmlFileList.stream()
                .map(file -> new Document(file, properties.getUrlPrefix(), rootFile))
                .collect(Collectors.toList());
        log.debug("构建文档完毕，一共 {} 篇文档", documentList.size());

        // 3. 针对每个 Document 进行分词处理，需要第三方库的支持
        for (Document document : documentList) {
            indexManager.add(document);
        }

        log.debug("索引构建完毕。");

        // 4. 将正排索引和倒排索引持久化下来（这里使用文件去保存）
        indexManager.save();
        log.debug("索引已经保存");
    }
}



